/*=============================================================================

  IO MANAGER MODULE

  FILE: IOmgr.h
  
  DESCRIPTION

    Manager Module Definition

  EXTERNALIZED FUNCTIONS

    
  Copyright (c) DaeSung Engineering Inc. All rights reserved.

=============================================================================*/
/*=============================================================================

                             EDIT HISTORY

  ---------  -------  -------------------------------------------------------
    when       who     what, where, why
  ---------  -------  -------------------------------------------------------
   06/28/03   nso4th   Version 0.1

=============================================================================*/

#ifndef _IOMGR_H_
#define _IOMGR_H_

/*=============================================================================
  HEADER INCLUSION
=============================================================================*/
#include <Cust_AppDef.h>

/*=============================================================================
  ENUMERATORS
=============================================================================*/
typedef enum
{
	IOmgr_BASE_E = 0x00,

	//-------------------------------------------
	//  BASIC IO EVENT
	//-------------------------------------------
	// INPUT
	IOmgr_IN_MOD0_E, // MOD 0, 0~31 
	IOmgr_IN_MOD1_E, // MOD 1, 32~63
	IOmgr_IN_MOD2_E, // MOD 2, 64~96
	IOmgr_IN_MOD3_E, // MOD 3, 96~127
	
	// OUTPUT
	IOmgr_OUT_MOD0_E, // MOD 0, 0~31 
	IOmgr_OUT_MOD1_E, // MOD 1, 32~63
	IOmgr_OUT_MOD2_E, // MOD 2, 64~96
	IOmgr_OUT_MOD3_E, // MOD 3, 96~127

	//-------------------------------------------
	//  SPECIAL IO EVENT
	//-------------------------------------------
	// OP-SWITCH
	IOmgr_RESET_E, // wp = TRUE(LONG), FALSE(SHORT)
	IOmgr_BUZZER_E,
	
	//-------------------------------------------
	//  INTERNLA USAGE
	//-------------------------------------------
	IOmgr_CHANGE_MAJSTATE_E = 0x0100,
	IOmgr_TIMER_0_E,
	IOmgr_TIMER_1_E,
	IOmgr_TIMER_2_E, // Signal tower
	IOmgr_TIMER_3_E, // OP button (Lamp)
	IOmgr_TIMER_4_E, // OP reset (Short & Long key)

} IOmgr_Event_e;

typedef enum
{
	IOmgr_IDL_S,
	IOmgr_CONN_S, // Connection ready
	IOmgr_TRY_S,
	IOmgr_ERR_S,  // Connection error
} IOmgr_MajorState_e;

typedef enum
{
	IOmgr_SIGT_NONE = 0x0000,

	IOmgr_SIGT_YELLOW = 0x0001,
	IOmgr_SIGT_GREEN = 0x0002,
	IOmgr_SIGT_RED = 0x0004,

	IOmgr_SIGT_YELLOW_BLINK = 0x0010,
	IOmgr_SIGT_GREEN_BLINK = 0x0020,
	IOmgr_SIGT_RED_BLINK = 0x0040

} IOMgr_SigTower_e;

/*=============================================================================
  IOmgr CLASS DEFINITION
=============================================================================*/
class IOmgr : public mgrBase
{
public:
	IOmgr();
	~IOmgr();

public:
	virtual boolean Init(void);
	virtual boolean Close(void);
	
/*---------------------------------------------------------
  REQUEST FUNCTION
---------------------------------------------------------*/
public:
	// IO update
	boolean REQ_IOUpdate(void);

	// Signal Tower
	boolean REQ_SIGT(dword sigColor);
	dword REQ_SIGTread(void);

/*---------------------------------------------------------
  STATE FUNCTION
---------------------------------------------------------*/
protected:
	virtual void STATE_SYNC(mcxt pTask);
	virtual void STATE_POLLING(void);
	
/*---------------------------------------------------------
  MONITORING
---------------------------------------------------------*/
public:
	void MON_LOCK(boolean lock);

protected:
	void MON_STATE(void);
	void MON_DEVICE(void);
	void MON_IOPOLL(int32 cnt);
	void MON_IOPOLL_INPUT(int32 cnt);
	void MON_IOPOLL_OUTPUT(int32 cnt);
	void MON_IOUPDATE(boolean dev_reset);

protected:
	void MON_Alloc(void);
	void MON_Free(void);
	
	mcxt	m_monSync;
	boolean	m_reqWait, m_reqLock, m_monLock, m_isCurSelAutoSW;
	int32	m_monCnt;

	// Connection related
	boolean	m_connDev, m_connReg;
	dword	m_connTime;

	// Signal tower
	dword	m_sigColor;
	boolean	m_sigOn;

	// OP SWITCH
	dword	m_switchReg;
	int32	m_switchCount;
	

/*---------------------------------------------------------
  COMMAND
---------------------------------------------------------*/
protected:
	void CMD_IOUpdate(void);
	void CMD_SIGT(byte sigColor);

/*---------------------------------------------------------
  UTILITY
---------------------------------------------------------*/
private:
	void OUT_SIGT(byte sigColor);
	
protected:
	void CMD_Alloc(void);
	void CMD_Free(void);

/*---------------------------------------------------------
  INTERNAL USAGE
---------------------------------------------------------*/
protected:
	void EVT_OPSWITCH(dword evt, dword wp, dword lp);

/*---------------------------------------------------------
  EVENT HANDLER
---------------------------------------------------------*/
public:
	virtual dword Event_Handler(dword dwType, dword dwEvent, dword wParam, dword lParam);
	dword Event_PreProc(dword dwType, dword dwEvent, dword wParam, dword lParam);

protected:
	void EVT_SIGTtimer(void);

protected:
	void Command_Handler(dword cmd, dword wp, dword lp);
};


#endif /* _IOMGR_H_ */


/*=============================================================================
  EXTERNALIZED FUNCTION DESCRPTIONS
=============================================================================*/
/*--- END OF IOmgr.H ---*/
